import axios from 'axios'
// import qs from 'qs'
import router from '@/router/index'
import { ElMessage } from 'element-plus'
import useUserStore from '@/store/modules/user'

const toLogin = () => {
    useUserStore().logout().then(() => {
        router.push({
            name: 'login',
            query: {
                redirect: router.currentRoute.value.path !== '/login' ? router.currentRoute.value.fullPath : undefined
            }
        })
    })
}
function setCookie(cname, cvalue, day) {
    var d = new Date()

    if (day != null) {
        d.setTime(d.getTime() + (day * 60 * 60 * 1000))
        var expires = 'expires=' + d.toUTCString()
        document.cookie = cname + '=' + cvalue + '; ' + expires
    } else {
        d.setTime(d.getTime() + (24 * 60 * 60 * 1000))
        var expiresX = 'expires=' + d.toUTCString()
        document.cookie = cname + '=' + cvalue + '; ' + expiresX
    }

}

// 清除cookie

function clearCookie(name) {
    setCookie(name, '', -1)
}

const api = axios.create({
    baseURL: import.meta.env.DEV && import.meta.env.VITE_OPEN_PROXY === 'true' ? '/proxy/' : import.meta.env.VITE_APP_API_BASEURL,
    timeout: 300000,
    responseType: 'json'
})

const apiBlob = axios.create({
    baseURL: import.meta.env.DEV && import.meta.env.VITE_OPEN_PROXY === 'true' ? '/proxy/' : import.meta.env.VITE_APP_API_BASEURL,
    timeout: 300000,
    responseType: 'blob'
})

api.interceptors.request.use(
    request => {
        const userStore = useUserStore()
        /**
         * 全局拦截请求发送前提交的参数
         * 以下代码为示例，在请求头里带上 token 信息
         */
        if (userStore.isLogin) {
            request.headers['Authorization'] = 'Bearer ' + userStore.token
        }
        // 是否将 POST 请求参数进行字符串化处理

        if (request.method === 'post' && request.data.file != undefined) {

            request.headers['Content-Type'] = 'multipart/form-data'
            // request.data = qs.stringify(request.data, {
            //     arrayFormat: 'brackets'
            // })
        }
        return request
    }
)

apiBlob.interceptors.response.use(
    response => {
        /**
         * 全局拦截请求发送后返回的数据，如果数据有报错则在这做全局的错误提示
         * 假设返回数据格式为：{ status: 1, error: '', data: '' }
         * 规则是当 status 为 1 时表示请求成功，为 0 时表示接口需要登录或者登录状态失效，需要重新登录
         * 请求出错时 error 会返回错误信息
         */
        if (response.status === 200) {
            if (response.statusText === '') {
                // 请求成功并且没有报错
                return Promise.resolve(response.data)
            } else {
                // 这里做错误提示
                // ElMessage.error(options)
                return Promise.reject(response.data)
            }
        } else {
            ElMessage({
                message: '请求失败' + response.data,
                type: 'error'
            })
            // toLogin()
        }
    },
    error => {
        switch (error.response.status) {
            case 500:
                ElMessage({
                    message: '服务端异常' + error.response.data.message,
                    type: 'error'
                })
                break
            case 403:
                if (error.response.expires != null) {
                    ElMessage({
                        message: '授权失败，请确认访问权限',
                        type: 'info'
                    })
                    // toLogin()
                    break
                }
                ElMessage({
                    message: '授权失败,请确认访问权限',
                    type: 'error'
                })
                // toLogin()
                break
            case 401:
                ElMessage({
                    message: '认证失败,请重新登录',
                    type: 'error'
                })
                toLogin()
                // localStorage.removeItem('token')
                clearCookie('token')
                break
            default:
                ElMessage({
                    message: '其他错误，参看接口' + error.response.status + error.response.data.message,
                    type: 'error'
                })
        }
        return Promise.reject(error)
    }
)

apiBlob.interceptors.request.use(
    request => {
        const userStore = useUserStore()
        /**
         * 全局拦截请求发送前提交的参数
         * 以下代码为示例，在请求头里带上 token 信息
         */
        if (userStore.isLogin) {
            request.headers['Authorization'] = 'Bearer ' + userStore.token
        }
        // 是否将 POST 请求参数进行字符串化处理

        if (request.method === 'post' && request.data.file != undefined) {

            request.headers['Content-Type'] = 'multipart/form-data'
            // request.data = qs.stringify(request.data, {
            //     arrayFormat: 'brackets'
            // })
        }
        return request
    }
)

api.interceptors.response.use(
    response => {
        /**
         * 全局拦截请求发送后返回的数据，如果数据有报错则在这做全局的错误提示
         * 假设返回数据格式为：{ status: 1, error: '', data: '' }
         * 规则是当 status 为 1 时表示请求成功，为 0 时表示接口需要登录或者登录状态失效，需要重新登录
         * 请求出错时 error 会返回错误信息
         */
        if (response.status === 200) {
            if (response.statusText === '') {
                // 请求成功并且没有报错
                return Promise.resolve(response.data)
            } else {
                // 这里做错误提示
                // ElMessage.error(options)
                return Promise.reject(response.data)
            }
        } else {
            ElMessage({
                message: '请求失败' + response.data,
                type: 'error'
            })
            // toLogin()
        }
    },
    error => {
        switch (error.response.status) {
            case 500:
                ElMessage({
                    message: '服务端异常' + error.response.data.message,
                    type: 'error'
                })
                break
            case 403:
                if (error.response.expires != null) {
                    ElMessage({
                        message: '授权失败，请确认访问权限',
                        type: 'info'
                    })
                    // toLogin()
                    break
                }
                ElMessage({
                    message: '授权失败,请确认访问权限',
                    type: 'error'
                })
                // toLogin()
                break
            case 401:
                ElMessage({
                    message: '认证失败,请重新登录',
                    type: 'error'
                })
                toLogin()
                clearCookie('token')
                // localStorage.removeItem('token')
                break
            default:
                ElMessage({
                    message: '其他错误，参看接口' + error.response.status + error.response.data.message,
                    type: 'error'
                })
        }
        return Promise.reject(error)
    }
)
export  { api, apiBlob }
